package columnd

import (
	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/ddd"
)

var (
	_ ExtraTypeAggregteRoot = &extraTypeAggregateRoot{}
)

const (
	// EvtTypExtra 扩展类型事件类型
	EvtTypExtra = "extra"
)

func initExtra(d ddd.Domain, repo ExtraTypeRepo) {
	ar := &extraTypeAggregateRoot{}
	ar.Init(ar, d, EvtTypExtra)
	repo.Init(repo, ar, EvtTypExtra)
}

// ExtraTypeAggregteRoot 扩展类型的聚合根
type ExtraTypeAggregteRoot interface {
	ddd.AggregateRoot

	// 加载所有可扩展类型
	LoadAll(ctx ddd.Context) ([]ExtraType, error)

	// 加载指定编码的扩展类型
	LoadOne(ctx ddd.Context, code string) (*ExtraType, error)
}

// ExtraTypeRepo 扩展类型仓储
type ExtraTypeRepo interface {
	ddd.Repository
	// 加载所有可扩展类型聚合根
	LoadAll(ctx ddd.Context) ([]ExtraType, error)

	// 加载指定编码的聚合根
	LoadOne(ctx ddd.Context, code string) (*ExtraType, error)
}

// ExtraSearch 查询条件
type ExtraSearch struct {
	Codes []string `json:"codes,omitempty"` // 查询条件
	// TODO 这里设置查询条件
}

// ExtraTypeAggregte 扩展类型聚合
type ExtraTypeAggregte struct {
	ddd.BaseAggregate
	ExtraType
}

// Repo 获取聚合根对应的仓储
func (e *ExtraTypeAggregte) Repo() ExtraTypeRepo {
	return e.Repository().(ExtraTypeRepo)
}

type extraTypeAggregateRoot struct {
	ddd.BaseAggregateRoot
}

func (e *extraTypeAggregateRoot) Repo() ExtraTypeRepo {
	return e.Repository().(ExtraTypeRepo)
}

// 加载所有可扩展类型聚合根
func (e *extraTypeAggregateRoot) LoadAll(ctx ddd.Context) ([]ExtraType, error) {
	return e.Repo().LoadAll(ctx)
}

// 加载指定编码的聚合根
func (e *extraTypeAggregateRoot) LoadOne(ctx ddd.Context, code string) (*ExtraType, error) {
	return e.Repo().LoadOne(ctx, code)
}
